package com.xinzhidi.web.netty.utils;


import com.xinzhidi.common.exception.ServiceException;
import org.apache.commons.lang3.StringUtils;

import java.util.ArrayList;
import java.util.List;

/***
 * @author cx
 * @date 2023/5/29 11:30
 */
public class BusFrameParser {

    /**
     * 前缀
     */
    private static final String PREFIX = "FEFEFE";


    /**
     * 获取校验和  不管中间的数字是十六进制还是十进制都可以使用该方法
     *
     * @param str       需要计算校验和的字符串，
     *                  每groupSize个为一组
     *                  例如：FE FE FE 68 20 97 14 09 14 00 00 00 04 04 A0 17 01
     *                  字符串不包含校验和及他后面的字符串
     * @param groupSize 以多少个为一组
     * @return 校验和
     */
    public static String getChecksum(String str, int groupSize) {
        if (!StringUtils.isNotBlank(str)) {
            throw new ServiceException("数据不能为空！");

        }
        str = str.replace(PREFIX, "");
//        str = str.substring(0, str.length() - 4);
        List<String> list = groupStr(str, groupSize);
        int sum = 0;
        for (String byteStr : list) {
            sum += Integer.parseInt(byteStr, 16);
        }
        String hexSum = Integer.toHexString(sum);
        return hexSum.substring(hexSum.length() - 2, hexSum.length()).toUpperCase();
    }

    /**
     * 将字符串每groupSize个为一组
     *
     * @param str       需要分组的字符串
     * @param groupSize 以多少个为一组
     * @return 分组后的字符串
     */
    public static List<String> groupStr(String str, int groupSize) {
        List<String> list = new ArrayList<>();
        char a;
        String strTemp = "";
        for (int i = 0; i < str.length(); i++) {
            a = str.charAt(i);
            strTemp += a;
            if ((i + 1) % groupSize == 0) {
                list.add(strTemp);
                strTemp = "";
            }
        }
        return list;
    }

    public static void main(String[] args) {
        String ss = "fefefe6840aaaaaaaaaaaaaa150a18a04078563412000000";
        ss = StringUtils.deleteWhitespace(ss);
        System.out.println(getChecksum(ss, 2));
//        System.out.println(groupStr("123456789", 2));
//        String hex1 = "68"; // 第一个十六进制数
//        String hex2 = "20"; // 第二个十六进制数
//        String hex3 = "97";
//        String hex4 = "14";
//        String hex5 = "09";
//        String hex6 = "14";
//        String hex7 = "00";
//        String hex8 = "00";
//        String hex9 = "00";
//
//        String hex10 = "04";
//        String hex11 = "04";
//        String hex12 = "A0";
//        String hex13 = "17";
//        String hex14 = "01";
//        String hex15 = "99";
//
//        // 将十六进制字符串转换为整数
//        int num1 = Integer.parseInt(hex1, 16);
//        int num2 = Integer.parseInt(hex2, 16);
//        int num3 = Integer.parseInt(hex3, 16);
//        int num4 = Integer.parseInt(hex4, 16);
//        int num5 = Integer.parseInt(hex5, 16);
//        int num6 = Integer.parseInt(hex6, 16);
//        int num7 = Integer.parseInt(hex7, 16);
//        int num8 = Integer.parseInt(hex8, 16);
//        int num9 = Integer.parseInt(hex9, 16);
//        int num10 = Integer.parseInt(hex10, 16);
//        int num11 = Integer.parseInt(hex11, 16);
//        int num12 = Integer.parseInt(hex12, 16);
//        int num13 = Integer.parseInt(hex13, 16);
//        int num14 = Integer.parseInt(hex14, 16);
//        int num15 = Integer.parseInt(hex15, 16);
//
//
//        // 将两个整数相加
//        int sum = num1 + num2 + num3 + num4 + num5 + num6 + num7 + num8 + num9 + num10 + num11 + num12 + num13 + num14 + num15;
//
//        // 将结果转换为十六进制字符串
//        String hexSum = Integer.toHexString(sum);
//
//        // 输出结果
//        System.out.println("最终结果为：" + hexSum);
    }

}
